package co.edu.usbcali.presentation.backingBeans;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.imageio.stream.FileImageOutputStream;
import javax.servlet.ServletContext;

import org.apache.commons.io.IOUtils;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.primefaces.component.calendar.Calendar;
import org.primefaces.component.commandbutton.CommandButton;
import org.primefaces.component.inputtext.InputText;
import org.primefaces.context.RequestContext;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.event.NodeSelectEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.StreamedContent;
import org.primefaces.model.TreeNode;
import org.primefaces.model.UploadedFile;

import co.edu.usbcali.datamodel.CategoriasDataModel;
import co.edu.usbcali.exceptions.ZMessManager;
import co.edu.usbcali.modelo.Anexos;
import co.edu.usbcali.modelo.Articulos;
import co.edu.usbcali.modelo.Categorias;
import co.edu.usbcali.modelo.CategoriasArticulos;
import co.edu.usbcali.modelo.EventosArticulos;
import co.edu.usbcali.modelo.dto.ArticulosDTO;
import co.edu.usbcali.modelo.dto.CategoriasDTO;
import co.edu.usbcali.modelo.dto.UsuariosDTO;
import co.edu.usbcali.presentation.businessDelegate.IBusinessDelegatorView;
import co.edu.usbcali.utilities.FacesUtils;

/**
 * @author Zathura Code Generator http://code.google.com/p/zathura
 *         www.zathuracode.org
 *
 */
@ManagedBean
@ViewScoped
public class CategoriasView implements Serializable {
	private static final long serialVersionUID = 1L;
	private InputText txtEstadoRegistro;
	private InputText txtNombre;
	private InputText txtUsuCrea;
	private InputText txtUsuModifica;
	private InputText txtCodigoCate;
	private Calendar txtFechaCreacion;
	private Calendar txtFechaModifcacion;
	private CommandButton btnSave;
	private CommandButton btnModify;
	private CommandButton btnDelete;
	private CommandButton btnClear;
	private List<CategoriasDTO> data;
	private List<CategoriasDTO> listaCategorias;
	private CategoriasDTO selectedCategorias;
	private Categorias entity;
	private boolean showDialog;
	private boolean guardar;
	private String estado;
	private CategoriasDataModel categoriaDataModel;
	@ManagedProperty(value = "#{BusinessDelegatorView}")
	private IBusinessDelegatorView businessDelegatorView;
    private UsuariosDTO usuario;
    
    private TreeNode raizCategorias;
    private TreeNode seleccionCategoria;
    
    private TreeNode raizFavorito;
    private TreeNode seleccionFavorito;
    
    private TreeNode raizArticulos;
    private TreeNode seleccionArticulo;

    //Articulo
    private Anexos anexo;
    private String txtAutor;
    private String txtDescripcion;
    private String txtNombreArticulo;
    private List<ArticulosDTO> listaArticulos;
    
	private static Session session;
	private static ServiceRegistry serviceRegistry;
	
	private StreamedContent file;
	//private byte[] blobBytes;
	
	private boolean renderedDetalle=false;
	private boolean renderedDetalleFavorito=false;
	private boolean esFavorito=false;
	private String url=null;
	private List<SelectItem> categorias;
	private String categoria;
	ArticulosDTO articulo;
	private String destination = "";
	private String nombreArchivo="";
	public CategoriasView() {
		super();
	}
	
	@PostConstruct
    public void traerColecciones(){
		
		usuario=(UsuariosDTO) FacesUtils.getManagedBeanFromSession("usuario");

		raizCategorias=new DefaultTreeNode("Raiz", null);
		
		raizFavorito=new DefaultTreeNode("Raiz", null);
		CategoriasDTO favorito=new CategoriasDTO();
		favorito.setNombre("FAVORITOS");
		favorito.setIcono("ui-icon-star");
		new DefaultTreeNode(favorito, raizFavorito);
		/*String email = FacesContext.getCurrentInstance().getExternalContext()
				.getUserPrincipal().getName();*/
		
		try {
			listaCategorias=getListaCategorias();
			for (CategoriasDTO categoria : listaCategorias) {
					categoria.setIcono("ui-icon-folder-collapsed");
					 new DefaultTreeNode(categoria, raizCategorias);
			}
			
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}		
    }
	
	 public void onArticuloSeleccionado(NodeSelectEvent event) {
		 
		 articulo = (ArticulosDTO) event.getTreeNode().getData();
		 
	    	renderedDetalle=true;
	    	if(esFavorito){
	    		renderedDetalleFavorito=true;
	    	}else{
	    		renderedDetalleFavorito=false;
	    	}
			
			initSession();

			anexo = (Anexos) session.get(Anexos.class,
					Long.valueOf(articulo.getCodigoAnexo()));
			
			
			ByteArrayInputStream in = new ByteArrayInputStream(anexo.getArchivo());
			InputStream stream=in;
			file=new DefaultStreamedContent(stream,"application/pdf", anexo.getNombre());

			FileImageOutputStream imageOutput;
					
			ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
	        String newFileName = servletContext.getRealPath("") + anexo.getNombre();

	        try {
				imageOutput = new FileImageOutputStream(new File(newFileName));
				imageOutput.write(anexo.getArchivo(), 0, anexo.getArchivo().length);
		        imageOutput.close();
			} catch (Exception e) {
				FacesUtils.addErrorMessage(e.getMessage());
			} 
	        
	    	
			endSession();

		    txtAutor=articulo.getAutor();
		    txtDescripcion=articulo.getDescripcion();
		    txtNombreArticulo=articulo.getNombre();
		    url=anexo.getNombre();
		   
		    RequestContext.getCurrentInstance().update("form");
	        
	    }
	
	 public void favoritoSeleccionado(NodeSelectEvent event) {
		 
		 selectedCategorias=(CategoriasDTO) event.getTreeNode().getData();
		 
		 consultarArticulosFavoritas();
	        
	    }
	 
	 public void categoriaSeleccionada(NodeSelectEvent event) {
		 
		 selectedCategorias=(CategoriasDTO) event.getTreeNode().getData();
		 
	    	try {
	    		//if(seleccionCategoria!=null){
	        		selectedCategorias=(CategoriasDTO) seleccionCategoria.getData();
	        		selectedCategorias.setCodUsuario(usuario.getCodigoUsua());       		      		
	        		esFavorito=false;
	                renderedDetalle=false;
	        		renderedDetalleFavorito=false;
	            		raizArticulos=new DefaultTreeNode("Raiz", null);
	            		listaArticulos=businessDelegatorView.articulosCategoriaUsuario(selectedCategorias);
	        			for (ArticulosDTO articulo  : listaArticulos) {
	        				 new DefaultTreeNode(articulo, raizArticulos);
	        			}
	        			
	        			if(listaArticulos==null||listaArticulos.size()==0){
	        				FacesUtils.addInfoMessage("Categoria vacia");
	        			}else{
	        				renderedDetalle=false;
	        		        RequestContext.getCurrentInstance().update("form");
	        			}
	    	//	}else{
	    		//	consultarArticulosFavoritas();
	    	//		renderedDetalleFavorito=false;
	    	//	}

			} catch (Exception e) {
				FacesUtils.addErrorMessage(e.getMessage());
			}
	        
	    }
	
	public String limpiar(){
		
		txtNombre.setValue("");
		estado="A";
		
		btnModify.setDisabled(false);
		
		return "";
	}
	
	public String editar(){
		
		btnModify.setDisabled(true);
		
	    if(selectedCategorias!=null){
			txtNombre.setValue(selectedCategorias.getNombre());
			estado=selectedCategorias.getEstadoRegistro();
	    }else{
	    	FacesUtils.addErrorMessage("No ha seleccionado ninguna Categoria");
	    }
		
		return "";		
	}
	
	public String crearArticulo(){
		
	    anexo=null;
	    txtAutor=null;
	    txtDescripcion=null;
	    txtNombreArticulo=null;
		
		return "";		
	}
    
    public String modificarArticulo(){
    	try {
    		
    		if(articulo.getCodigoUsua_Usuarios()==usuario.getCodigoUsua()){
    			initSession();

    			anexo = (Anexos) session.get(Anexos.class,
    					Long.valueOf(articulo.getCodigoAnexo()));
            	
    			endSession();

        	    txtAutor=articulo.getAutor();
        	    txtDescripcion=articulo.getDescripcion();
        	    txtNombreArticulo=articulo.getNombre();
        	    anexo=null;
        	    
        	    RequestContext.getCurrentInstance().execute("$('#dlgModificar').modal('show');");
    		}else{
    			FacesUtils.addErrorMessage("No eres el autor de este articulo");
    		}
    		

		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}
    	
    	return "";
    }

	public String guardarCategoria() {

		try {

			if (btnModify.isDisabled() == false) {

				entity = new Categorias();
				entity.setEstadoRegistro(estado);
				entity.setFechaCreacion(new Date());
				entity.setFechaModifcacion(new Date());
				entity.setNombre(FacesUtils.checkString(txtNombre));
				entity.setUsuCrea(usuario.getEmail());
				entity.setUsuModifica(usuario.getEmail());
				businessDelegatorView.saveCategorias(entity);				
				FacesUtils.addInfoMessage("Se guardo con exito la categoria");

			} else {

				entity = new Categorias();
				entity.setCodigoCate(selectedCategorias.getCodigoCate());
				entity.setEstadoRegistro(estado);
				entity.setFechaCreacion(new Date());
				entity.setFechaModifcacion(new Date());
				entity.setNombre(FacesUtils.checkString(txtNombre));
				entity.setUsuCrea(usuario.getEmail());
				entity.setUsuModifica(usuario.getEmail());
				businessDelegatorView.updateCategorias(entity);

				FacesUtils.addInfoMessage("Se modifico con exito la categoria");

			}
			data=null;
			categoriaDataModel = new CategoriasDataModel(getData());
			RequestContext.getCurrentInstance().update("formDlg2");
			try {
				selectedCategorias=data.get(0);
			} catch (Exception e) {

			}
					
			limpiar();
			
			RequestContext.getCurrentInstance().update("form:tabla");

		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";

	}
	
    /* Metodo para Descargar PDF*/
    public DefaultStreamedContent byteToImage(byte[] imgBytes, String nombreArchivo, String formato) throws IOException {
    	ByteArrayInputStream img = new ByteArrayInputStream(imgBytes);
    	return new DefaultStreamedContent(img,"application/pdf", nombreArchivo);
    }
    
    /* Subir archivo*/
    public void handleFileUpload(FileUploadEvent event) throws IOException {
    	   
        UploadedFile file = event.getFile();
        System.out.println(file.getFileName());
        byte[] pdfBytes = IOUtils.toByteArray(file.getInputstream());
        anexo=new Anexos();
        anexo.setArchivo(pdfBytes);
        anexo.setFormato("application/pdf");
        anexo.setNombre(file.getFileName());
        anexo.setUrl("http://vaoi.comuf.com/" + nombreArchivo);
        nombreArchivo=event.getFile().getFileName();
		copyFile(nombreArchivo, event.getFile().getInputstream());
		ftpServerTransfer(destination + nombreArchivo, event.getFile().getFileName());       
        
        FacesUtils.addInfoMessage("El archivo se cargo con exito");
    }
    
	public void copyFile(String fileName, InputStream in) {
		try {
			String sistema = System.getProperty("os.name");

			if (sistema.equals("Linux")) {
				setDestination("/tmp/");
			}
			if (sistema.equals("Windows")) {
				setDestination("C:\\tmp\\");
			}
			// write the inputStream to a FileOutputStream
			OutputStream out = new FileOutputStream(new File(destination
					+ fileName));

			int read = 0;
			byte[] bytes = new byte[1024];

			while ((read = in.read(bytes)) != -1) {
				out.write(bytes, 0, read);
			}

			in.close();
			out.flush();
			out.close();

		} catch (IOException e) {
			System.out.println(e.getMessage());
		}
	}
    
	public void ftpServerTransfer(String filePath, String name) {
		FTPClient ftpClient = new FTPClient();

		FileInputStream inputStream = null;

		try {

			// pass directory path on server to connect
			ftpClient.connect("vaoi.comuf.com");

			// pass username and password, returned true if authentication is
			// successful
			boolean login = ftpClient.login("a1413972", "a1413972");

			ftpClient.enterLocalActiveMode();
			if (login) {
				System.out.println("Connection established...");
				inputStream = new FileInputStream(filePath);

				boolean type = ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

				if (type) {
					boolean uploaded = ftpClient.storeFile("/public_html/"
							+ name, inputStream);

					if (uploaded) {
						System.out.println("File uploaded successfully !");
					} else {
						System.out.println("Error in uploading file !");
					}
				}

				// logout the user, returned true if logout successfully
				boolean logout = ftpClient.logout();
				if (logout) {
					System.out.println("Connection close...");
				}
			} else {
				System.out.println("Connection fail...");
			}

		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				ftpClient.disconnect();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

    //Guardar Nuevo Articulo
    public String guardarArticulo(){
    	
    	try {
    		
    		if(anexo==null){
    			throw new Exception("El anexo es requerido");
    		}
    		
    		//Crear Articulo
    		Articulos articulo = new Articulos();
    		articulo.setAutor(txtAutor);
    		articulo.setDescripcion(txtDescripcion);
    		articulo.setEstadoRegistro("A");
    		articulo.setFechaCreacion(new Date());
    		articulo.setFechaModifcacion(new Date());
    		articulo.setNombre(txtNombreArticulo);
    		articulo.setUsuCrea(usuario.getEmail());
    		articulo.setUsuModifica(usuario.getEmail());
    		articulo.setUsuarios(businessDelegatorView.getUsuarios(usuario.getCodigoUsua()));
            businessDelegatorView.saveArticulos(articulo);
            
            //Crear Anexo
            anexo.setArticulos(articulo);
            
            businessDelegatorView.saveAnexos(anexo);
            
            //Crear CategoriaArticulos
            CategoriasArticulos cateArti=new CategoriasArticulos();
            cateArti.setFechaCreacion(new Date());
            cateArti.setFechaModifcacion(new Date());
            cateArti.setUsuCrea(usuario.getEmail());
            cateArti.setUsuModifica(usuario.getEmail());
            cateArti.setEstadoRegistro("A");
            cateArti.setArticulos(articulo);
            Long codCate=Long.parseLong(categoria);
            
            for (int i = 0; i < listaCategorias.size(); i++) {
            	if(listaCategorias.get(i).getCodigoCate()==codCate){
            		selectedCategorias=listaCategorias.get(i);
            		break;
            	}
			}
                       
            selectedCategorias.setCodUsuario(usuario.getCodigoUsua());
            cateArti.setCategorias(businessDelegatorView.getCategorias(selectedCategorias.getCodigoCate()));
            businessDelegatorView.saveCategoriasArticulos(cateArti);
            
            RequestContext.getCurrentInstance().execute("$('#dlgArticulo').modal('hide');");
            
            FacesUtils.addInfoMessage("Se Guardo el articulo con exito");
            
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}
    	
    	return "";
    }
    
    //Modificar Articulo
    public String guardarArticuloModificado(){
    	
    	try {
    		ArticulosDTO art = (ArticulosDTO) seleccionArticulo.getData();   		

    		Articulos articulo = businessDelegatorView.getArticulos(art.getCodigoArti());
    		articulo.setAutor(txtAutor);
    		articulo.setDescripcion(txtDescripcion);
    		articulo.setFechaModifcacion(new Date());
    		articulo.setNombre(txtNombreArticulo);
    		articulo.setUsuModifica(usuario.getEmail());
            businessDelegatorView.updateArticulos(articulo);
            
            //Crear Anexo
            if(anexo!=null){
            	Anexos anexo2 =businessDelegatorView.getAnexos(art.getCodigoAnexo());
            	anexo2.setUrl("http://vaoi.comuf.com/" + nombreArchivo);
            	anexo2.setArchivo(anexo.getArchivo());
                businessDelegatorView.updateAnexos(anexo2);
            }          
            
            onNodeSelectCategoria();
            RequestContext.getCurrentInstance().execute("$('#dlgModificar').modal('hide');");
            
            FacesUtils.addInfoMessage("Se Modifico el articulo con exito");
            
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}
    	
    	return "";
    }
    
    //Seleccionar categoria
    public String onNodeSelectCategoria(){
    	try {
    		if(seleccionCategoria!=null){
        		selectedCategorias=(CategoriasDTO) seleccionCategoria.getData();
        		selectedCategorias.setCodUsuario(usuario.getCodigoUsua());       		      		
        		esFavorito=false;
                renderedDetalle=false;
        		renderedDetalleFavorito=false;
            		raizArticulos=new DefaultTreeNode("Raiz", null);
            		listaArticulos=businessDelegatorView.articulosCategoriaUsuario(selectedCategorias);
        			for (ArticulosDTO articulo  : listaArticulos) {
        				 new DefaultTreeNode(articulo, raizArticulos);
        			}
        			
        			if(listaArticulos==null||listaArticulos.size()==0){
        				FacesUtils.addInfoMessage("Categoria vacia");
        			}else{
        				renderedDetalle=false;
        		        RequestContext.getCurrentInstance().update("form");
        			}
    		}else{
    			consultarArticulosFavoritas();
    			renderedDetalleFavorito=false;
    		}

		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}
    	return "";
    }
           
    public void consultarArticulosFavoritas(){
    	
    	try {
    		esFavorito=true;
    		renderedDetalle=false;
    		listaArticulos= businessDelegatorView.articulosFavoritosUsuario(usuario.getCodigoUsua());
			
			if(listaArticulos==null||listaArticulos.size()==0){
				raizArticulos=new DefaultTreeNode("Raiz", null);
    			FacesUtils.addInfoMessage("No hay Articulos en favoritos");
    		}else{

    			raizArticulos=new DefaultTreeNode("Raiz", null);
    			for (ArticulosDTO articulo  : listaArticulos) {
    				 new DefaultTreeNode(articulo, raizArticulos);
    			}
    			
    		}
			RequestContext.getCurrentInstance().update("form");
			
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}
    }
    
    //Eliminar De Favorito
    public void quitarArticuloFavorito(){
    	
    	try {
    		ArticulosDTO art = (ArticulosDTO) seleccionArticulo.getData(); 
        	Long codArticulo=art.getCodigoArti();
        	businessDelegatorView.eliminarArticuloFavorito(codArticulo, usuario.getCodigoUsua());
    		consultarArticulosFavoritas();
    		renderedDetalleFavorito=false;
    		FacesUtils.addInfoMessage("El articulo se elimino de favoritos");
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

    }
    
    public void cargar_articulo(){
    	renderedDetalle=true;
    	if(esFavorito){
    		renderedDetalleFavorito=true;
    	}else{
    		renderedDetalleFavorito=false;
    	}
    	ArticulosDTO articulo = (ArticulosDTO) seleccionArticulo.getData();
		
		initSession();

		anexo = (Anexos) session.get(Anexos.class,
				Long.valueOf(articulo.getCodigoAnexo()));
		
		
		ByteArrayInputStream in = new ByteArrayInputStream(anexo.getArchivo());
		InputStream stream=in;
		file=new DefaultStreamedContent(stream,"application/pdf", anexo.getNombre());

		FileImageOutputStream imageOutput;
				
		ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
        String newFileName = servletContext.getRealPath("") + anexo.getNombre();

        try {
			imageOutput = new FileImageOutputStream(new File(newFileName));
			imageOutput.write(anexo.getArchivo(), 0, anexo.getArchivo().length);
	        imageOutput.close();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		} 
        
    	
		endSession();

	    txtAutor=articulo.getAutor();
	    txtDescripcion=articulo.getDescripcion();
	    txtNombreArticulo=articulo.getNombre();
	    url=anexo.getNombre();
	   
	    RequestContext.getCurrentInstance().update("form");
    }
    
    // Eliminar Articulo
    public void action_delete() throws Exception {
        try {
        	
        	if(articulo.getCodigoUsua_Usuarios()==usuario.getCodigoUsua()){
        	
            	Articulos arti= businessDelegatorView.getArticulos(articulo.getCodigoArti());
                businessDelegatorView.deleteArticulos(arti);
                
                raizArticulos=new DefaultTreeNode("Raiz", null);
                selectedCategorias.setCodUsuario(usuario.getCodigoUsua()); 
    			listaArticulos=businessDelegatorView.articulosCategoriaUsuario(selectedCategorias);
    			for (ArticulosDTO arti2 : listaArticulos) {
    				 new DefaultTreeNode(arti2, raizArticulos);
    			}
    			
    			if(listaArticulos==null||listaArticulos.size()==0){
    				FacesUtils.addInfoMessage("Categoria vacia");
    			}
                
                FacesUtils.addInfoMessage("El Articulo se elimino con éxito");
        	}else{
        		FacesUtils.addErrorMessage("No eres el autor de este articulo");
        	}

        } catch (Exception e) {
            FacesUtils.addErrorMessage(e.getMessage());
        }
    }
    
    // Agregar Articulo a Favoritos 
    public void agregarArticuloFavorito() throws Exception {
        try {
        	ArticulosDTO articulo =(ArticulosDTO) seleccionArticulo.getData();
        	Articulos arti= businessDelegatorView.getArticulos(articulo.getCodigoArti());
            EventosArticulos evento=new EventosArticulos();
            evento.setFechaFavorito(new Date());
            evento.setFavorito("S");
            evento.setMeGusta("N");
            evento.setUsuarios(businessDelegatorView.getUsuarios(usuario.getCodigoUsua()));
            evento.setArticulos(arti);

        	businessDelegatorView.agregarArticuloFavorito(evento);
                       
            FacesUtils.addInfoMessage("El Articulo se agrego a favoritos con éxito");
        } catch (Exception e) {
            FacesUtils.addErrorMessage(e.getMessage());
        }
    }
    
    // Agregar Me gusta Articulo 
    public void meGustaArticulo() throws Exception {
        try {
        	ArticulosDTO articulo =(ArticulosDTO) seleccionArticulo.getData();
        	Articulos arti= businessDelegatorView.getArticulos(articulo.getCodigoArti());
        	
            EventosArticulos evento=new EventosArticulos();
            evento.setFechaMeGusta(new Date());
            evento.setFavorito("N");
            evento.setMeGusta("S");
            evento.setUsuarios(businessDelegatorView.getUsuarios(usuario.getCodigoUsua()));
            evento.setArticulos(arti);
            
        	businessDelegatorView.meGustaArticulo(evento);
                       
            FacesUtils.addInfoMessage("se agrego me gusta al articulo");
            
        } catch (Exception e) {
            FacesUtils.addErrorMessage(e.getMessage());
        }
    }

	public String action_save() {
		try {
			if ((selectedCategorias == null) && (entity == null)) {
				action_create();
			} else {
				action_modify();
			}

			data = null;
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_create() {
		try {
			entity = new Categorias();

			Long codigoCate = FacesUtils.checkLong(txtCodigoCate);

			entity.setCodigoCate(codigoCate);
			entity.setEstadoRegistro(FacesUtils.checkString(txtEstadoRegistro));
			entity.setFechaCreacion(FacesUtils.checkDate(txtFechaCreacion));
			entity.setFechaModifcacion(FacesUtils
					.checkDate(txtFechaModifcacion));
			entity.setNombre(FacesUtils.checkString(txtNombre));
			entity.setUsuCrea(FacesUtils.checkString(txtUsuCrea));
			entity.setUsuModifica(FacesUtils.checkString(txtUsuModifica));
			businessDelegatorView.saveCategorias(entity);
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYSAVED);

		} catch (Exception e) {
			entity = null;
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_modify() {
		try {
			if (entity == null) {
				Long codigoCate = new Long(selectedCategorias.getCodigoCate());
				entity = businessDelegatorView.getCategorias(codigoCate);
			}

			entity.setEstadoRegistro(FacesUtils.checkString(txtEstadoRegistro));
			entity.setFechaCreacion(FacesUtils.checkDate(txtFechaCreacion));
			entity.setFechaModifcacion(FacesUtils
					.checkDate(txtFechaModifcacion));
			entity.setNombre(FacesUtils.checkString(txtNombre));
			entity.setUsuCrea(FacesUtils.checkString(txtUsuCrea));
			entity.setUsuModifica(FacesUtils.checkString(txtUsuModifica));
			businessDelegatorView.updateCategorias(entity);
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYMODIFIED);
		} catch (Exception e) {
			data = null;
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public InputText getTxtEstadoRegistro() {
		return txtEstadoRegistro;
	}

	public void setTxtEstadoRegistro(InputText txtEstadoRegistro) {
		this.txtEstadoRegistro = txtEstadoRegistro;
	}

	public InputText getTxtNombre() {
		return txtNombre;
	}

	public void setTxtNombre(InputText txtNombre) {
		this.txtNombre = txtNombre;
	}

	public InputText getTxtUsuCrea() {
		return txtUsuCrea;
	}

	public void setTxtUsuCrea(InputText txtUsuCrea) {
		this.txtUsuCrea = txtUsuCrea;
	}

	public InputText getTxtUsuModifica() {
		return txtUsuModifica;
	}

	public void setTxtUsuModifica(InputText txtUsuModifica) {
		this.txtUsuModifica = txtUsuModifica;
	}

	public Calendar getTxtFechaCreacion() {
		return txtFechaCreacion;
	}

	public void setTxtFechaCreacion(Calendar txtFechaCreacion) {
		this.txtFechaCreacion = txtFechaCreacion;
	}

	public Calendar getTxtFechaModifcacion() {
		return txtFechaModifcacion;
	}

	public void setTxtFechaModifcacion(Calendar txtFechaModifcacion) {
		this.txtFechaModifcacion = txtFechaModifcacion;
	}

	public InputText getTxtCodigoCate() {
		return txtCodigoCate;
	}

	public void setTxtCodigoCate(InputText txtCodigoCate) {
		this.txtCodigoCate = txtCodigoCate;
	}

	public List<CategoriasDTO> getData() {
		try {
			if (data == null) {
				data = businessDelegatorView.getDataCategorias();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		return data;
	}

	public void setData(List<CategoriasDTO> categoriasDTO) {
		this.data = categoriasDTO;
	}

	public CategoriasDTO getSelectedCategorias() {
		return selectedCategorias;
	}

	public void setSelectedCategorias(CategoriasDTO categorias) {
		this.selectedCategorias = categorias;
	}

	public CommandButton getBtnSave() {
		return btnSave;
	}

	public void setBtnSave(CommandButton btnSave) {
		this.btnSave = btnSave;
	}

	public CommandButton getBtnModify() {
		return btnModify;
	}

	public void setBtnModify(CommandButton btnModify) {
		this.btnModify = btnModify;
	}

	public CommandButton getBtnDelete() {
		return btnDelete;
	}

	public void setBtnDelete(CommandButton btnDelete) {
		this.btnDelete = btnDelete;
	}

	public CommandButton getBtnClear() {
		return btnClear;
	}

	public void setBtnClear(CommandButton btnClear) {
		this.btnClear = btnClear;
	}

	public TimeZone getTimeZone() {
		return java.util.TimeZone.getDefault();
	}

	public IBusinessDelegatorView getBusinessDelegatorView() {
		return businessDelegatorView;
	}

	public void setBusinessDelegatorView(
			IBusinessDelegatorView businessDelegatorView) {
		this.businessDelegatorView = businessDelegatorView;
	}

	public boolean isShowDialog() {
		return showDialog;
	}

	public void setShowDialog(boolean showDialog) {
		this.showDialog = showDialog;
	}

	public boolean isGuardar() {
		return guardar;
	}

	public void setGuardar(boolean guardar) {
		this.guardar = guardar;
	}

	public CategoriasDataModel getCategoriaDataModel() {
		if (categoriaDataModel == null) {
			categoriaDataModel = new CategoriasDataModel(getData());
			try {
				selectedCategorias=data.get(0);
			} catch (Exception e) {

			}
		}
		return categoriaDataModel;
	}

	public void setCategoriaDataModel(CategoriasDataModel categoriaDataModel) {
		this.categoriaDataModel = categoriaDataModel;
	}

	public String getEstado() {
		return estado;
	}

	public void setEstado(String estado) {
		this.estado = estado;
	}

	public List<CategoriasDTO> getListaCategorias() {
		try {
			if(listaCategorias==null){
				listaCategorias=businessDelegatorView.getDataCategorias();	
			}
			
		} catch (Exception e) {
			
		}

		return listaCategorias;
	}

	public void setListaCategorias(List<CategoriasDTO> listaCategorias) {
		this.listaCategorias = listaCategorias;
	}

	public TreeNode getRaizCategorias() {
		return raizCategorias;
	}

	public void setRaizCategorias(TreeNode raizCategorias) {
		this.raizCategorias = raizCategorias;
	}

	public TreeNode getSeleccionCategoria() {
		return seleccionCategoria;
	}

	public void setSeleccionCategoria(TreeNode seleccionCategoria) {
		this.seleccionCategoria = seleccionCategoria;
	}

	public TreeNode getRaizArticulos() {
		return raizArticulos;
	}

	public void setRaizArticulos(TreeNode raizArticulos) {
		this.raizArticulos = raizArticulos;
	}

	public TreeNode getSeleccionArticulo() {
		return seleccionArticulo;
	}

	public void setSeleccionArticulo(TreeNode seleccionArticulo) {
		this.seleccionArticulo = seleccionArticulo;
	}

	public String getTxtAutor() {
		return txtAutor;
	}

	public void setTxtAutor(String txtAutor) {
		this.txtAutor = txtAutor;
	}

	public String getTxtDescripcion() {
		return txtDescripcion;
	}

	public void setTxtDescripcion(String txtDescripcion) {
		this.txtDescripcion = txtDescripcion;
	}

	public String getTxtNombreArticulo() {
		return txtNombreArticulo;
	}

	public void setTxtNombreArticulo(String txtNombreArticulo) {
		this.txtNombreArticulo = txtNombreArticulo;
	}

	public TreeNode getRaizFavorito() {
		return raizFavorito;
	}

	public void setRaizFavorito(TreeNode raizFavorito) {
		this.raizFavorito = raizFavorito;
	}

	public TreeNode getSeleccionFavorito() {
		return seleccionFavorito;
	}

	public void setSeleccionFavorito(TreeNode seleccionFavorito) {
		this.seleccionFavorito = seleccionFavorito;
	}

	private static void initSession() {
		Configuration configuration = new Configuration().configure();
		serviceRegistry = new StandardServiceRegistryBuilder().applySettings(
				configuration.getProperties()).build();

		SessionFactory sessionFactory = configuration
				.buildSessionFactory(serviceRegistry);

		session = sessionFactory.openSession();
		session.beginTransaction();
	}

	private static void endSession() {
		session.getTransaction().commit();
		session.close();

		StandardServiceRegistryBuilder.destroy(serviceRegistry);
	}
	
	public StreamedContent getFile() {
		try {
			ByteArrayInputStream in = new ByteArrayInputStream(anexo.getArchivo());
			InputStream stream=in;
			file=new DefaultStreamedContent(stream,"application/pdf", anexo.getNombre());

		} catch (Exception e) {
			System.out.println(e.getMessage());
		}

		return file;
	}

	public void setFile(StreamedContent file) {
		this.file = file;
	}

	public boolean isRenderedDetalle() {
		return renderedDetalle;
	}

	public void setRenderedDetalle(boolean renderedDetalle) {
		this.renderedDetalle = renderedDetalle;
	}

	public boolean isRenderedDetalleFavorito() {
		return renderedDetalleFavorito;
	}

	public void setRenderedDetalleFavorito(boolean renderedDetalleFavorito) {
		this.renderedDetalleFavorito = renderedDetalleFavorito;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public List<SelectItem> getCategorias() {
		if(categorias==null){
			categorias=new ArrayList<SelectItem>();
			for (int i = 0; i < listaCategorias.size(); i++) {
				categorias.add(new SelectItem(listaCategorias.get(i).getCodigoCate(), listaCategorias.get(i).getNombre()));
				
			}
		}
		return categorias;
	}

	public void setCategorias(List<SelectItem> categorias) {
		this.categorias = categorias;
	}

	public String getCategoria() {
		return categoria;
	}

	public void setCategoria(String categoria) {
		this.categoria = categoria;
		System.out.println(categoria);
	}

	public String getDestination() {
		return destination;
	}

	public void setDestination(String destination) {
		this.destination = destination;
	}

	
}